<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    function Father(uname, age){
      this.uname = uname
      this.age = age
    }
    Father.prototype.sing = function(){
      console.log('我会唱歌')
    }
    function Son(uname, age){
      Father.call(this,uname, age)
    }
    
    const father = new Father('zd', 35)
    // console.log(mySon)
    // 想要用Father的原型对象的唱歌这个方法，但是又不想重写，想到了方案一
    // Son.prototype = Father.prototype
    // console.log(mySon)
    // console.log(father)
    // father.sing()
    // 看到可以实现，但是修改了Son.prototype，使得两个构造函数的prototype指向了堆中的同一个对象，当Son添加一个方法时，使得Father的实例化对象也可以访问这个方法
    // mySon.sing()
    // 解决方法，将实例对象给到Son的prototype，间接性的访问father的prototype
    Son.prototype = new Father()
    const son = new Son('zs', 18)
    son.sing()
  </script>
</body>
</html>